﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace Systemet.Technical
{
    /// <summary>
    /// Klassen används för att plocka Intäktsbudgetar, avdelningskostnader, produktkostnader (resurs), 
    /// sätta avkastningskrav.
    /// </summary>
    class BudgetConnection
    {
        private LinqToSQLDataContext database;
        private string pass = AccessController.Instance.Connection;

        public object GetAvdelning()
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                var sums = from Aktivitetskostnad in database.Aktivitetskostnads
                           join Aktivitet in database.Aktivietetsregisters on Aktivitetskostnad.aktivitetsID equals Aktivitet.aktivitetsID
                           join Avdelning in database.Avdelningsregisters on Aktivitet.avdelningsnamn equals Avdelning.avdelningsnamn
                           group Aktivitetskostnad by Avdelning.avdelningsnamn into groupings
                           orderby groupings.Key ascending
                           select new
                           {
                               Avdelningsnamn = groupings.Key,
                               Summa = groupings.Sum(g => g.belopp),
                           };

                database.Connection.Close();
                return sums.ToList();
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        public List<Intäktsbudgetregister> GetProductBudget(string id)
        {
            try
            {
                pass = AccessController.Instance.Connection;
                database = new LinqToSQLDataContext(pass);

                var q = from Intäktsbudget in database.Intäktsbudgetregisters
                        where Intäktsbudget.produktID == id
                        group Intäktsbudget by id into g
                        select new
                        {
                            Avtal = g.Sum(x => x.avtal),
                            Tillägg = g.Sum(x => x.tillagg),
                            Budget = g.Sum(x => x.tillagg + x.avtal)
                        };

                List<Intäktsbudgetregister> intäktsbudgetering = q.AsEnumerable().Select(i => new Intäktsbudgetregister
                {
                    avtal = i.Avtal,
                    tillagg = i.Tillägg
                }).ToList();

                database.Connection.Close();
                return intäktsbudgetering;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        public List<Intäktsbudget> GetProductsIntäktsregister(string ID)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                var q = from Intäktsbudget in database.Intäktsbudgetregisters
                        where Intäktsbudget.produktID == ID
                        select new
                        {
                            ProdID = Intäktsbudget.produktID,
                            IntBudID = Intäktsbudget.intBudID,
                            Avtal = Intäktsbudget.avtal,
                            Tillägg = Intäktsbudget.tillagg,
                            Budget = (Intäktsbudget.tillagg + Intäktsbudget.avtal)

                        };

                List<Intäktsbudget> intäktsbudgetering = q.AsEnumerable().Select(i => new Intäktsbudget
                {
                    Avtal = i.Avtal,
                    Tillägg = i.Tillägg
                }).ToList();

                database.Connection.Close();
                return intäktsbudgetering;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        public List<Intäktsbudget> GetProductGroupIntäktsBudget(string groupID)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                var q = from Intäktsbudget in database.Intäktsbudgetregisters
                        join Produktregister in database.Produktregisters on Intäktsbudget.produktID equals Produktregister.produktID
                        where Produktregister.produktGruppID == groupID
                        select new
                        {
                            ProdID = Intäktsbudget.produktID,
                            IntBudID = Intäktsbudget.intBudID,
                            Avtal = Intäktsbudget.avtal,
                            Tillägg = Intäktsbudget.tillagg,
                            Budget = (Intäktsbudget.tillagg + Intäktsbudget.avtal),
                            ProduktGrupp = Produktregister.Produktgrupp,
                            ProduktGruppID = Produktregister.produktGruppID
                        };

                List<Intäktsbudget> intäktsbudgetering = q.AsEnumerable().Select(i => new Intäktsbudget
                {
                    Avtal = i.Avtal,
                    Tillägg = i.Tillägg,
                    ProduktGrupp = i.ProduktGrupp.produktGruppNamn
                }).ToList();

                database.Connection.Close();
                return intäktsbudgetering;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        public List<ProduktKostnad> GetProduktKonto(string ID)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);
                List<ProduktKostnad> produktkostnader = new List<ProduktKostnad>();

                var q = from Produktkostnad in database.Produktkostnads
                        where Produktkostnad.produktID.Contains(ID.TrimEnd())
                        select Produktkostnad;

                foreach (Produktkostnad pk in q)
                {
                    ProduktKostnad prodk = new ProduktKostnad();

                    prodk.ProduktID = pk.produktID;
                    prodk.Belopp = pk.belopp;
                    prodk.Kontonummer = pk.kontonummer;

                    produktkostnader.Add(prodk);
                }

                database.Connection.Close();
                return produktkostnader;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        public List<Aktivitetskostnad> GetAktivitetKonto(string ID)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);
                List<Aktivitetskostnad> aktivitetKostnader = new List<Aktivitetskostnad>();

                var q = from Aktivitetskostnad in database.Aktivitetskostnads
                        where Aktivitetskostnad.aktivitetsID.Contains(ID)
                        select Aktivitetskostnad;

                foreach (Aktivitetskostnad ak in q)
                {
                    aktivitetKostnader.Add(ak);
                }

                database.Connection.Close();
                return aktivitetKostnader;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        public int GetAvkastningsKrav()
        {
            try
            {
                int avkastning = -1;
                database = new LinqToSQLDataContext(pass);
                List<Avkastning> avkastningsList = new List<Avkastning>();

                var q = from Kostnadskontoregister in database.Kostnadskontoregisters
                        where Kostnadskontoregister.kontonummer == "9999"
                        select Kostnadskontoregister;

                foreach (Kostnadskontoregister a in q)
                {
                    if (a.belopp != null)
                        avkastning = (int)a.belopp;
                }

                database.Connection.Close();
                return avkastning;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return -1;
            }
        }

        public bool SetAvkastningsKrav(int belopp)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                var setAvkastKrav = from Kostnadskontoregister in database.Kostnadskontoregisters
                                    where Kostnadskontoregister.kontonummer == "9999"
                                    select Kostnadskontoregister;

                foreach (Kostnadskontoregister kkr in setAvkastKrav)
                {
                    kkr.belopp = belopp;
                }

                database.SubmitChanges();

                database.Connection.Close();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }

        public List<ProduktKostnad> BudgetedProductGroups(string prodgrupp)
        {
            try
            {
                pass = AccessController.Instance.Connection;
                database = new LinqToSQLDataContext(pass);

                List<ProduktKostnad> listOfProdDirektKost = new List<ProduktKostnad>();

                var prodgrupper = from Produktkostnad in database.Produktkostnads
                                  join Produkt in database.Produktregisters on Produktkostnad.produktID equals Produkt.produktID
                                  join Produktgrupp in database.Produktgrupps on Produkt.produktGruppID equals Produktgrupp.produktGruppID
                                  where Produktgrupp.produktGruppID.Contains(prodgrupp)
                                  select Produktkostnad;


                foreach (Produktkostnad pk in prodgrupper)
                {
                    ProduktKostnad pkost = new ProduktKostnad();
                    pkost.ProduktID = pk.produktID;
                    pkost.Belopp = pk.belopp;
                    listOfProdDirektKost.Add(pkost);
                }

                return listOfProdDirektKost;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }

        }

        public List<ProduktKostnad> BudgetedProductAvdelning(string productavd)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                List<ProduktKostnad> listOfProdDirekt = new List<ProduktKostnad>();

                var prodavdelning = from Produktkostnad in database.Produktkostnads
                                    join Produktregister in database.Produktregisters on Produktkostnad.produktID equals Produktregister.produktID
                                    where Produktregister.avdelningsnamn == productavd
                                    select Produktkostnad;

                foreach (Produktkostnad pk in prodavdelning)
                {
                    ProduktKostnad prodk = new ProduktKostnad();

                    prodk.ProduktID = pk.produktID;
                    prodk.Belopp = pk.belopp;

                    listOfProdDirekt.Add(prodk);
                }

                return listOfProdDirekt;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        public object GetAllAvdelningar()
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                var avdelningar = from Avdelningsregister in database.Avdelningsregisters
                                  select new
                                  {
                                      Avdelningsnamn = Avdelningsregister.avdelningsnamn.TrimEnd()
                                  };

                database.Connection.Close();
                return avdelningar;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        public List<Intäktsbudgetregister> GetAllIntäktsbudgetAllProducts()
        {
            List<Intäktsbudgetregister> listOfAllIntBudAllProd = new List<Intäktsbudgetregister>();
            database = new LinqToSQLDataContext(pass);

            var q = from Intäktsbudgetregister in database.Intäktsbudgetregisters
                    select Intäktsbudgetregister;

            foreach (Intäktsbudgetregister ibr in q)
            {
                Intäktsbudgetregister ib = new Intäktsbudgetregister();

                ib.intBudID = ibr.intBudID;
                ib.avtal = ibr.avtal;
                ib.tillagg = ibr.tillagg;
                ib.tim = ibr.tim;
                ib.produktID = ibr.produktID;

                listOfAllIntBudAllProd.Add(ib);
            }

            database.Connection.Close();
            return listOfAllIntBudAllProd;
        }
    }
}
